package cga.framework;

import java.util.Random;

/**
 * 
 * @author Robert
 *
 */
public class Populacja {
	private Osobnik stado[];
	private Osobnik stado_temp[];
	
	private int wielkosc;

	private double tablicaSelekcji[][];
	private double sumaPrzystosowania = 0;
	
	public Populacja(int wielk, double pocz, double kon, int dok){
		wielkosc = wielk;
		stado = new Osobnik[wielkosc];
		stado_temp = new Osobnik[wielkosc];
		tablicaSelekcji = new double[2][wielkosc];
		
		for(int i = 0; i < stado.length; i++){
			stado[i] = new Osobnik(pocz, kon, dok);
		}
	}
	
	
	/**
	 * Funkcja liczy nam przystosowanie kazdego osobnika i jednoczesnie sumuje calkowite przystosowanie
	 */
	public void ocenPrzystosowanie(){
		System.out.println("\t\tObliczam przystosowanie kazdego z osobnikow");
		for(int i = 0; i < stado.length; i++){
			tablicaSelekcji[0][i] = stado[i].przystosowanie();
		}
		
		for(int i = 0; i < tablicaSelekcji[0].length; i++){
			sumaPrzystosowania=sumaPrzystosowania+tablicaSelekcji[0][i];
		}
	}
	
	/**
	 * Funkcja oblicza prawdopodobienstwo wyboru kazdego osobnika
	 * i zapisuje w dedykowanej tablicy
	 */
	public void obliczPrawdopodobienstwoWyboru(){
		System.out.println("\t\tLicze prawdopodobienstwo wyboru kazdego osobnika");
		double calosc = 0;
		for(int i = 0; i < tablicaSelekcji[1].length; i++){
			tablicaSelekcji[1][i] = (tablicaSelekcji[0][i]/(sumaPrzystosowania))*100;
			calosc=calosc+tablicaSelekcji[1][i];
		}
		System.out.println(calosc);
	}
	
	/**
	 * 
	 * @return liczba osobnikow wybrana podczas selekcji
	 * @throws CloneNotSupportedException 
	 */
	public void Selection() throws CloneNotSupportedException{
		Random los = new Random();
		for(int i = 0; i<wielkosc;i++){
			int losik = los.nextInt(100);
			int temp=0;
			double suma = 0;
			for(int j = 0; j<tablicaSelekcji[1].length;j++){
				while(losik>suma){
					suma=suma+tablicaSelekcji[1][j];
					temp++;
				}
			}
			stado_temp[i]=(Osobnik)stado[temp].clone();
		}
	}
	
	/**
	 * 
	 * @return wartosc laczna przystosowania
	 */
	public double getSumaPrzystosowania(){
		return sumaPrzystosowania;
	}
	
	
	/**
	 * pokazuje przystosowanie kazdego osobnika z osobna
	 */
	public void showPrzystosowanie(){
		for(int i = 0; i < tablicaSelekcji[0].length; i++){
			System.out.println(tablicaSelekcji[0][i]);
		}
		
	}
	
	/**
	 * Funkcja pokazuje nam cale stado
	 */
	public void showStado(){
		for(int i = 0; i < stado.length; i++){
			stado[i].showChromosom();
		}
	}
	
	/**
	 * Funkcja pokazuje tymczasowe stado
	 */
	public void showStadoTemp(){
		for(int i = 0; i < stado.length; i++){
			stado_temp[i].showChromosom();
		}
	}
	
	/**
	 * Funkcja pokazauje nam prawdopodobienstwo wyboru kazdego osobnika
	 */
	public void showPrawdopodobienstwoWyboru(){
		for(int i = 0; i < tablicaSelekcji[1].length; i++){
			System.out.println(tablicaSelekcji[1][i]);
		}
	}
	
	/**
	 * 
	 * @param nr numer osobnika w stadzie
	 * @return osobnik
	 */
	public Osobnik getOsobnik(int nr){
		return stado[nr];
	}
	
	/**
	 * 
	 * @return 
	 * @throws CloneNotSupportedException
	 */
	public void Crossover() throws CloneNotSupportedException{
		System.out.println("Zajaczki sie bzykaja ;)");
		Random losujacy = new Random();
		Random krzyzowanie = new Random();
		for(int i = 0;i < wielkosc; i++){
			int los1 = losujacy.nextInt(wielkosc);
			int los2 = losujacy.nextInt(wielkosc);
			int pktKrzyzowania = krzyzowanie.nextInt(stado[1].getDlugoscChromosomu());
			System.out.println("Krzyzuje osobnika: " + los1 + " z osobnikiem: " + los2 + " w punkcie: " + pktKrzyzowania);
			for(int j = pktKrzyzowania;j<stado[1].getDlugoscChromosomu();j++){
				stado_temp[los1].setGen(j, stado_temp[los2].getGen(j));
				stado_temp[los2].setGen(j, stado_temp[los1].getGen(j));
			}
		}
	}

}
